package com.luhai.shipmentscheck.util;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

import androidx.drawerlayout.widget.DrawerLayout;

import java.lang.reflect.Method;

public class ScreenUtils {

	private Activity mActivity;
	// 状态栏颜色
	private int mColor = -1;
	// 状态栏drawble
	private Drawable mDrawable;
	// 是否是最外层布局是 DrawerLayout 的侧滑菜单
	private boolean mIsDrawerLayout;
	// 是否包含 ActionBar
	private boolean mIsActionBar;
	// 侧滑菜单页面的内容视图
	private int mContentResourseIdInDrawer;

	public ScreenUtils(Activity activity) {
		mActivity = activity;
	}

	public static ScreenUtils with(Activity activity) {
		return new ScreenUtils(activity);
	}

	public int getColor() {
		return mColor;
	}

	public ScreenUtils setColor(int color) {
		mColor = color;
		return this;
	}

	public Drawable getDrawable() {
		return mDrawable;
	}

	public ScreenUtils setDrawable(Drawable drawable) {
		mDrawable = drawable;
		return this;
	}

	public boolean isDrawerLayout() {
		return mIsDrawerLayout;
	}

	public boolean isActionBar() {
		return mIsActionBar;
	}

	public ScreenUtils setIsActionBar(boolean actionBar) {
		mIsActionBar = actionBar;
		return this;
	}

	/**
	 * 是否是最外层布局为 DrawerLayout 的侧滑菜单
	 *
	 * @param drawerLayout 是否最外层布局为 DrawerLayout
	 * @param contentId    内容视图的 id
	 * @return
	 */
	public ScreenUtils setDrawerLayoutContentId(boolean drawerLayout, int contentId) {
		mIsDrawerLayout = drawerLayout;
		mContentResourseIdInDrawer = contentId;
		return this;
	}

	public void init() {
		fullScreen(mActivity);
		if (mColor != -1) {
			// 设置了状态栏颜色
			addStatusViewWithColor(mActivity, mColor);
		}
		if (mDrawable != null) {
			// 设置了状态栏 drawble，例如渐变色
			addStatusViewWithDrawble(mActivity, mDrawable);
		}
		if (isDrawerLayout()) {
			// 未设置 fitsSystemWindows 且是侧滑菜单，需要设置 fitsSystemWindows 以解决 4.4 上侧滑菜单上方白条问题
			fitsSystemWindows(mActivity);
		}
		if (isActionBar()) {
			// 要增加内容视图的 paddingTop,否则内容被 ActionBar 遮盖
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
				ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView()
						.findViewById(android.R.id.content);
				rootView.setPadding(0, getStatusBarHeight(mActivity) + getActionBarHeight(mActivity), 0, 0);
			}
		}
	}

	/*
	 * 去除 ActionBar 阴影 public ScreenUtils clearActionBarShadow() { if
	 * (Build.VERSION.SDK_INT >= 21) { ActionBar supportActionBar =
	 * ((AppCompatActivity) mActivity).getSupportActionBar(); if (supportActionBar
	 * != null) { supportActionBar.setElevation(0); } } return this; }
	 */

	/**
	 * 设置页面最外层布局 FitsSystemWindows 属性
	 *
	 * @param activity
	 */
	private void fitsSystemWindows(Activity activity) {
		ViewGroup contentFrameLayout = (ViewGroup) activity.findViewById(android.R.id.content);
		View parentView = contentFrameLayout.getChildAt(0);
		if (parentView != null && Build.VERSION.SDK_INT >= 14) {
			parentView.setFitsSystemWindows(true);
			// 布局预留状态栏高度的 padding
			if (parentView instanceof DrawerLayout) {
				DrawerLayout drawer = (DrawerLayout) parentView;
				// 将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置
				drawer.setClipToPadding(false);
			}
		}
	}

	/**
	 * 利用反射获取状态栏高度
	 *
	 * @return
	 */
	public static int getStatusBarHeight(Activity activity) {
		int result = 0;
		// 获取状态栏高度的资源id
		int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
		if (resourceId > 0) {
			result = activity.getResources().getDimensionPixelSize(resourceId);
		}
		Log.e("getStatusBarHeight", result + "");
		return result;
	}

	/**
	 * 获得 ActionBar 的高度
	 *
	 * @param context
	 * @return
	 */
	public static int getActionBarHeight(Context context) {
		int result = 0;
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
			TypedValue tv = new TypedValue();
			context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
			result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
		}
		return result;
	}

	/**
	 * 添加状态栏占位视图
	 *
	 * @param activity
	 */
	private void addStatusViewWithColor(Activity activity, int color) {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
			if (isDrawerLayout()) {
				// 要在内容布局增加状态栏，否则会盖在侧滑菜单上
				ViewGroup rootView = (ViewGroup) activity.findViewById(android.R.id.content);
				// DrawerLayout 则需要在第一个子视图即内容试图中添加padding
				View parentView = rootView.getChildAt(0);
				LinearLayout linearLayout = new LinearLayout(activity);
				linearLayout.setOrientation(LinearLayout.VERTICAL);
				View statusBarView = new View(activity);
				ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
						getStatusBarHeight(activity));
				statusBarView.setBackgroundColor(color);
				// 添加占位状态栏到线性布局中
				linearLayout.addView(statusBarView, lp);
				// 侧滑菜单
				DrawerLayout drawer = (DrawerLayout) parentView;
				// 内容视图
				View content = activity.findViewById(mContentResourseIdInDrawer);
				// 将内容视图从 DrawerLayout 中移除
				drawer.removeView(content);
				// 添加内容视图
				linearLayout.addView(content, content.getLayoutParams());
				// 将带有占位状态栏的新的内容视图设置给 DrawerLayout
				drawer.addView(linearLayout, 0);
			} else {
				// 设置 paddingTop
				ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView()
						.findViewById(android.R.id.content);
				rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);
				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
					// 直接设置状态栏颜色
					activity.getWindow().setStatusBarColor(color);
				} else {
					// 增加占位状态栏
					ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
					View statusBarView = new View(activity);
					ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
							getStatusBarHeight(activity));
					statusBarView.setBackgroundColor(color);
					decorView.addView(statusBarView, lp);
				}
			}
		}
	}

	/**
	 * 添加状态栏占位视图
	 *
	 * @param activity
	 */
	private void addStatusViewWithDrawble(Activity activity, Drawable drawable) {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
			// 占位状态栏
			View statusBarView = new View(activity);
			ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
					getStatusBarHeight(activity));
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
				statusBarView.setBackground(drawable);
			} else {
				statusBarView.setBackgroundDrawable(drawable);
			}
			if (isDrawerLayout()) {
				// 要在内容布局增加状态栏，否则会盖在侧滑菜单上
				ViewGroup rootView = (ViewGroup) activity.findViewById(android.R.id.content);
				// DrawerLayout 则需要在第一个子视图即内容试图中添加padding
				View parentView = rootView.getChildAt(0);
				LinearLayout linearLayout = new LinearLayout(activity);
				linearLayout.setOrientation(LinearLayout.VERTICAL);
				// 添加占位状态栏到线性布局中
				linearLayout.addView(statusBarView, lp);
				// 侧滑菜单
				DrawerLayout drawer = (DrawerLayout) parentView;
				// 内容视图
				View content = activity.findViewById(mContentResourseIdInDrawer);
				// 将内容视图从 DrawerLayout 中移除
				drawer.removeView(content);
				// 添加内容视图
				linearLayout.addView(content, content.getLayoutParams());
				// 将带有占位状态栏的新的内容视图设置给 DrawerLayout
				drawer.addView(linearLayout, 0);
			} else {
				// 增加占位状态栏，并增加状态栏高度的 paddingTop
				ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
				decorView.addView(statusBarView, lp);
				// 设置 paddingTop
				ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView()
						.findViewById(android.R.id.content);
				rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);
			}
		}
	}

	/**
	 * 通过设置全屏，设置状态栏透明
	 *
	 * @param activity
	 */
	private void fullScreen(Activity activity) {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
				// 5.x开始需要把颜色设置透明，否则导航栏会呈现系统默认的浅灰色
				Window window = activity.getWindow();
				View decorView = window.getDecorView();
				// 两个 flag 要结合使用，表示让应用的主体内容占用系统状态栏的空间
				int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
				window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
				decorView.setSystemUiVisibility(option);
				window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
				window.setStatusBarColor(Color.TRANSPARENT);
				// 导航栏颜色也可以正常设置
//	                window.setNavigationBarColor(Color.TRANSPARENT);
			} else {
				Window window = activity.getWindow();
				WindowManager.LayoutParams attributes = window.getAttributes();
				int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
				int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
				attributes.flags |= flagTranslucentStatus;
//	                attributes.flags |= flagTranslucentNavigation;
				window.setAttributes(attributes);
			}
		}
	}

	/**
	 * 通过设置全屏，设置状态栏透明 导航栏黑色
	 *
	 * @param activity
	 */
	public static void setStatusTransparent(Activity activity) {
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
				Window window = activity.getWindow();

				WindowManager.LayoutParams attributes = window.getAttributes();
				int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
				int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
//	                attributes.flags |= flagTranslucentStatus;
				attributes.flags |= flagTranslucentNavigation;
				window.setAttributes(attributes);

				window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
						| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
				window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
				window.setStatusBarColor(Color.TRANSPARENT);
				window.setNavigationBarColor(Color.TRANSPARENT);
			} else {
				Window window = activity.getWindow();
				WindowManager.LayoutParams attributes = window.getAttributes();
				int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
				int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
				attributes.flags |= flagTranslucentStatus;
				attributes.flags |= flagTranslucentNavigation;
				window.setAttributes(attributes);
			}
		}
	}

	public static void full(boolean enable, Activity activity) {
		if (enable) {
			WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
			lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
			activity.getWindow().setAttributes(lp);
			activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
		} else {
			WindowManager.LayoutParams attr = activity.getWindow().getAttributes();
			attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
			activity.getWindow().setAttributes(attr);
			activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
		}
	}

	/**
	 * 获取屏幕宽
	 * 
	 * @return
	 */
	public static int getScreenWidth(Context context) {
		DisplayMetrics mDisplayMetrics = context.getResources().getDisplayMetrics();
		return mDisplayMetrics.widthPixels;
	}

	/**
	 * 获取屏幕高
	 * 
	 * @return
	 */
	public static int getScreenHeight(Context context) {
		DisplayMetrics mDisplayMetrics = context.getResources().getDisplayMetrics();
		return mDisplayMetrics.heightPixels;
	}

	/**
	 * 隐藏虚拟按键，并且全屏
	 */
	public static void hideBottomUIMenu(Activity appCompatActivity) {
		// 隐藏虚拟按键，并且全屏
		if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
			View v = appCompatActivity.getWindow().getDecorView();
			v.setSystemUiVisibility(View.GONE);
		} else if (Build.VERSION.SDK_INT >= 19) {
			// for new api versions.
			View decorView = appCompatActivity.getWindow().getDecorView();
			int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
					| View.SYSTEM_UI_FLAG_FULLSCREEN;
			decorView.setSystemUiVisibility(uiOptions);
		}
	}

	/**
	 * 取消状态栏
	 * 
	 * @param activity
	 */
	public static void setStatusBarGone(Activity activity) {
		activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
	}

	/**
	 * 获取是否存在NavigationBar，是否有虚拟按钮
	 */
	public static boolean checkDeviceHasNavigationBar(Context context) {
		boolean hasNavigationBar = false;
		Resources rs = context.getResources();
		int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
		if (id > 0) {
			hasNavigationBar = rs.getBoolean(id);
		}
		try {
			Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
			Method m = systemPropertiesClass.getMethod("get", String.class);
			String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
			if ("1".equals(navBarOverride)) {
				hasNavigationBar = false;
			} else if ("0".equals(navBarOverride)) {
				hasNavigationBar = true;
			}
		} catch (Exception e) {

		}
		return hasNavigationBar;

	}

	/**
	 * 获取虚拟按钮ActionBar的高度
	 *
	 * @param activity activity
	 * @return ActionBar高度
	 */
	public static int getActionBarHeight(Activity activity) {
		TypedValue tv = new TypedValue();
		if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
			return TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());
		}
		return 0;
	}

	/**
	 * 控制键盘收起
	 * @param context
	 * @param editText
	 */
	public static void retractKeyboard(Context context, EditText editText) {
		if (context == null | editText == null) {
			return;
		}
		InputMethodManager inputMethodManager = (InputMethodManager) context
				.getSystemService(Activity.INPUT_METHOD_SERVICE);
		inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
		// 同上，editText也为你要收起键盘的那个EditText对象控件
	}

}
